iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
1
Blockchain

Go to Blockchain: 從區塊鏈基礎到用 Go 實作區塊鏈系列 第 10

Go to Blockchain: Day10 開始自幹區塊鏈-架設區塊

  • 分享至 

  • xImage
  •  

我們知道區塊鏈是由數個區塊串成鏈組成的,因此我們現在就來開工吧~

區塊 structure

  • 我們要先創建一個區塊的 structure,並且這個 structure 需要包含先前所說的資料
    • 由於我們還沒有要加 POW 先不用把 Nonce 和難度加上去
  • 所以會包含以下資料:
    1. Timestamp
    2. 區塊 Body - Data
    3. 前一個區塊的 Hash - PrevBlockHash
    4. 區塊 Body 的 Hash - Hash
type Block struct {
	Timestamp int64
	Data []byte
	PrevBlockHash []byte
	Hash []byte
}
  • 因為我們現在沒有 POW ,但是由於區塊鏈的特性,我們還是要加上 Hash值,因此我們要加上一個設置 Hash 的函數
func (b *Block) SetHash() {
	timestamp := []byte(strconv.FormatInt(b.Timestamp, 10)) // 把 Timestamp 換算成 10 進位
	payload := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{}) // 把 Block 的 Data 都放進去
	hash := sha256.Sum256(payload) // 產生 Hash
	b.Hash = hash[:] // 設置 Hash
}
  • 接著就可以產生區塊惹~
func CreateBlock(Data string, PrevBlockHash []byte) *Block{
	block := &Block{
		time.Now().Unix(), // 如此才會產生先前說的 Unix 的時間戳
		[]byte(Data),
		PrevBlockHash,
		[]byte{},
	}                      // 創建一個 Block 類別
	block.SetHash()        // 為 Block 設置 Hash
	return block
}
  • 附上 python3 code
import time
import hashlib

class Block:
	def __init__(self, timestamp, data, prevblockhash, hash_value):
		self.timestamp = timestamp
		self.data = data
		self.prevblockhash = prevblockhash
		self.hash = hash_value

	def SetHash(self):
		self.timestamp = str(int self.timestamp)
		payload = self.timestamp + self.data + self.prevblockhash
		s = hashlib.sha256()
		s.update(payload)
		self.hash = str(s.hexdigest())

def CreateBlock(data, prevblockhash):
	b = block(time.time(), data, prevblockhash, '')
	b.SetHash()
	return b
  • 明天就會把最基本的區塊鏈寫出來惹w

上一篇
Go to Blockchain: Day9 比特幣運作模式總結
下一篇
Go to Blockchain: Day11 開始自幹區塊鏈-完成基本區塊鏈
系列文
Go to Blockchain: 從區塊鏈基礎到用 Go 實作區塊鏈30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言